package com.huangmin66.rongcloud;

import android.app.Activity;
import android.app.ActivityManager;
import android.content.Context;

import com.huangmin66.rongcloud.listener.MyConnectionStatusListener;
import com.huangmin66.rongcloud.listener.MyConversationClickListener;
import com.huangmin66.rongcloud.listener.MyConversationListBehaviorListener;
import com.huangmin66.rongcloud.listener.MyReceiveMessageListener;
import com.huangmin66.rongcloud.listener.MySendMessageListener;
import com.huangmin66.rongcloud.provider.MyGroupInfoProvider;
import com.huangmin66.rongcloud.provider.MyIGroupMembersProvider;
import com.huangmin66.rongcloud.provider.MyLocationProvider;
import com.huangmin66.rongcloud.provider.MyTextMessageItemProvider;

import java.util.Map;

import io.rong.imkit.RongIM;
import io.rong.imlib.RongIMClient;
import io.rong.imlib.model.Conversation;
import io.rong.imlib.model.Group;
import io.rong.imlib.model.UserInfo;

/**
 * 描述： 封装类
 * 作者： 天天童话丶
 * 时间： 2018/5/30.
 */

public class RongCloudUtils {

    private static RongCloudUtils mRongCloudInstance;
    private Context mApplicationContext;

    /**
     * 初始化 RongCloud.
     *
     * @param context 上下文。
     */
    public static void init(Context context) {

        if (mRongCloudInstance == null) {
            synchronized (RongCloudUtils.class) {
                if (mRongCloudInstance == null) {
                    mRongCloudInstance = new RongCloudUtils(context);
                }
            }
        }
    }

    public static RongCloudUtils getInstance(){
        return mRongCloudInstance;
    }

    private RongCloudUtils(Context context) {
        this.mApplicationContext = context.getApplicationContext();
        initRongIM(context);
    }

    private void initRongIM(Context context) {
        /**
         * OnCreate 会被多个进程重入，这段保护代码，确保只有您需要使用 RongIM 的进程和 Push 进程执行了 init。
         * io.rong.push 为融云 push 进程名称，不可修改。
         */
        if (context.getApplicationInfo().packageName
                .equals(getCurProcessName(context.getApplicationContext()))) {

            /**
             * IMKit SDK调用第一步 初始化
             */
            RongIM.init(context);

            try {
                RongIM.registerMessageTemplate(new MyTextMessageItemProvider());
            } catch (Exception e) {
                e.printStackTrace();
            }

            //设置会话界面操作的监听器。
            RongIM.setConversationClickListener(new MyConversationClickListener());
//            RongIM.setConversationBehaviorListener(new MyConversationBehaviorListener());
            //设置会话列表界面操作的监听器。
            RongIM.setConversationListBehaviorListener(new MyConversationListBehaviorListener());
            //设置连接状态的监听器。
            RongIM.setConnectionStatusListener(new MyConnectionStatusListener());
            //获取用户信息 方式 默认 消息体携带用户信息
            RongIM.getInstance().setMessageAttachedUserInfo(true); //设置消息体内是否携带用户信息。
//            RongIM.setUserInfoProvider(new MyUserInfoProvider(), true);
            //设置发送消息的监听。
            RongIM.getInstance().setSendMessageListener(new MySendMessageListener());
            RongIM.setGroupInfoProvider(new MyGroupInfoProvider(), true);
            //设置地理位置提供者,不用位置的同学可以注掉此行代码
            RongIM.setLocationProvider(new MyLocationProvider());
            //设置接收消息的监听器
            RongIM.setOnReceiveMessageListener(new MyReceiveMessageListener());

            RongIM.getInstance().setGroupMembersProvider(new MyIGroupMembersProvider());
            setReadReceiptConversationType();
            //显示新消息提醒
            RongIM.getInstance().enableNewComingMessageIcon(true);
            //显示未读消息数目
            RongIM.getInstance().enableUnreadMessageIcon(true);
            //RongIM.setGroupUserInfoProvider(new MyGroupUserInfoProvider(), true);//seal app暂时未使用这种方式,目前使用UserInfoProvider
        }
    }

    /**
     * 消息回执，即未读和已读 如果不设置的话，默认只有 PRIVATE 类型的会话支持消息回执。
     */
    private void setReadReceiptConversationType() {
        Conversation.ConversationType[] types = new Conversation.ConversationType[]{
                Conversation.ConversationType.PRIVATE,
                Conversation.ConversationType.GROUP,
                Conversation.ConversationType.DISCUSSION
        };
        RongIM.getInstance().setReadReceiptConversationTypeList(types);
    }

    /**
     * <p>连接服务器，在整个应用程序全局，只需要调用一次，需在 {@link # init(Context)} 之后调用。</p>
     * <p>如果调用此接口遇到连接失败，SDK 会自动启动重连机制进行最多10次重连，分别是1, 2, 4, 8, 16, 32, 64, 128, 256, 512秒后。
     * 在这之后如果仍没有连接成功，还会在当检测到设备网络状态变化时再次进行重连。</p>
     *
     * @param token    从服务端获取的用户身份令牌（Token）。
     * @param
     * @return RongIM  客户端核心类的实例。
     */
    public void connect(Activity activity, String token, RongIMClient.ConnectCallback callback){
        if (activity.getApplicationInfo().packageName.equals(getCurProcessName(mApplicationContext))) {
            RongIM.connect(token, callback);
        }
    }

    /**
     * 启动会话列表界面。
     *
     * @param context               应用上下文。
     * @param supportedConversation 定义会话列表支持显示的会话类型，及对应的会话类型是否聚合显示。
     *                              例如：supportedConversation.put(Conversation.ConversationType.PRIVATE.getName(), false) 非聚合式显示 private 类型的会话。
     */
    public void startConversationList(Context context, Map<String, Boolean> supportedConversation){
        RongIM.getInstance().startConversationList(context, supportedConversation);
    }


    /**
     * 启动聚合后的某类型的会话列表。<br> 例如：如果设置了单聊会话为聚合，则通过该方法可以打开包含所有的单聊会话的列表。
     *
     * @param context          应用上下文。
     * @param conversationType 会话类型。
     */
    public void startSubConversationList(Context context, Conversation.ConversationType conversationType){
        RongIM.getInstance().startSubConversationList(context, conversationType);
    }

    /**
     * 开启私聊
     * @param context
     * @param targetId
     * @param title
     */
    public  void startPrivateChat(Context context, String targetId, String title){
        RongIM.getInstance().startPrivateChat(context, targetId, title);
    }

    /**
     * 开启会话
     * @param context
     * @param conversationType
     * @param targetId
     * @param title
     */
    public void startConversation(Context context, Conversation.ConversationType conversationType, String targetId, String title){
        if (RongIM.getInstance() != null) {
            RongIM.getInstance().startConversation(context, conversationType, targetId, title);
        } else {
            throw new ExceptionInInitializerError("RongCloud SDK not init");
        }
    }

    /**
     * 设置当前用户信息，
     *
     * @param userInfo 当前用户信息
     */
    public void setCurrentUserInfo(UserInfo userInfo){
        if (RongIM.getInstance() != null) {
            RongIM.getInstance().setCurrentUserInfo(userInfo);
        } else {
            throw new ExceptionInInitializerError("RongCloud SDK not init");
        }
    }

    /**
     * 刷新用户缓存数据。
     *
     * @param userInfo 需要更新的用户缓存数据。
     */
    public void refreshUserInfoCache(UserInfo userInfo){
        if (RongIM.getInstance() != null) {
            RongIM.getInstance().refreshUserInfoCache(userInfo);
        } else {
            throw new ExceptionInInitializerError("RongCloud SDK not init");
        }
    }

    /**
     * 刷新群组缓存数据。
     *
     * @param group 需要更新的群组缓存数据。
     */
    public void refreshGroupInfoCache(Group group){
        if (RongIM.getInstance() != null) {
            RongIM.getInstance().refreshGroupInfoCache(group);
        } else {
            throw new ExceptionInInitializerError("RongCloud SDK not init");
        }
    }

    /**
     * 断开与融云服务器的连接。当调用此接口断开连接后，仍然可以接收 Push 消息。
     */
    public void disconnect(){
        if (RongIM.getInstance() != null) {
            RongIM.getInstance().disconnect();
        }
    }

    /**
     * 断开与融云服务器的连接，并且不再接收 Push 消息。
     */
    public void logout(){
        if (RongIM.getInstance() != null) {
            RongIM.getInstance().logout();
        }
    }

    private String getCurProcessName(Context context) {
        int pid = android.os.Process.myPid();
        ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        for (ActivityManager.RunningAppProcessInfo appProcess : activityManager.getRunningAppProcesses()) {
            if (appProcess.pid == pid) {
                return appProcess.processName;
            }
        }
        return null;
    }
}
